iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
佛心分享-IT 人自學之術

Python學習馬拉松:30天挑戰系列 第 28

Day28. 實作練習:數獨解決器Sudoku Solver

  • 分享至 

  • xImage
  •  
  • 教學來源:https://www.youtube.com/watch?v=8ext9G7xspg
  • 這段 Python 程式碼實現了一個 Sudoku 解決器。Sudoku 是一種數學邏輯遊戲,玩家需要根據已知的數字,在一個 9x9 的格子上填入數字 1-9,使得每一行、每一列和每一個 3x3 的小九宮格中,數字 1-9 都只出現一次。
  • 程式碼與執行結果:
    https://ithelp.ithome.com.tw/upload/images/20241012/20168364N1Ykh81JqA.png

https://ithelp.ithome.com.tw/upload/images/20241012/20168364JWsraXTzH9.png

  • 程式結構
    ◆ find_next_empty 函數:
    ◎ 這個函數用來尋找下一個空的格子。
    ◎ 遍歷整個棋盤,找到第一個值為 -1 的格子(用 -1 表示空格子),並返回其行和列索引。
    ◎ 如果找不到空的格子,則返回 None。
    ◆ is_valid 函數:
    ◎ 這個函數用來判斷在指定位置填入一個數字是否合法。
    ◎ 檢查該數字是否在同一行、同一列或同一個 3x3 小九宮格中出現過。
    ◎ 如果數字合法,返回 True,否則返回 False。
    ◆ solve_sudoku 函數:
    ◎ 這是整個解題的核心函數。
    ◎ 採用回溯法(backtracking)來解決 Sudoku。
    ◎ 首先找到下一個空的格子。
    ◎ 對於這個空格子,嘗試填入 1 到 9 之間的數字。
    ◎ 對於每個嘗試的數字,檢查是否合法。
    ○ 如果合法,則遞歸調用 solve_sudoku 函數,試圖解出剩下的部分。
    ○ 如果遞歸調用返回 True,表示找到了一個解。
    ○ 如果遞歸調用返回 False,則回溯,嘗試填入其他數字。
    ○ 如果所有數字都試過了,仍然找不到解,則表示原來的 Sudoku 無解。
  • 程式流程
  1. 初始化棋盤: 將一個部分填好的 Sudoku 棋盤作為輸入。
  2. 尋找空格子: 使用 find_next_empty 函數找到下一個空的格子。
  3. 嘗試填數字: 對於找到的空格子,依次嘗試填入 1 到 9。
  4. 檢查合法性: 使用 is_valid 函數檢查填入的數字是否合法。
  5. 遞歸求解: 如果合法,則遞歸調用 solve_sudoku 函數,試圖解出剩下的部分。
  6. 回溯: 如果遞歸調用返回 False,則回溯,嘗試填入其他數字。
  7. 找到解或無解: 如果找到了一個解,則返回 True;如果所有可能都試過了,仍然找不到解,則返回 False。

上一篇
Day27. 實作練習:踩地雷遊戲 Minesweeper
下一篇
Day29. 實作練習:圈圈叉叉Tic-Tac-Toe --AI
系列文
Python學習馬拉松:30天挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言